#ifndef ECRIREXML_H
#define ECRIREXML_H

#include "ADDObjetBase.h"

#include <QtCore/QObject>
#include <QtXml/QDomDocument>
#include <QtXml/QDomElement>
#include <QtCore/QFile>
#include <QtCore/QTextStream>

class Joueur;

/**
 * Classe permettant de créer un fichier xml à partir d'un Joueur. On
 * utilise le parseur XML natif de Qt, ce qui permet de créer très
 * facilement l'arorescence du fichier xml, lequel est indenté
 * automatiquement pour une meilleure lisibilité.
 *
 * @author Johan "Solo" Luisier
 */
class EcrireXML : public QObject, public ADDObjetBase
{
Q_OBJECT
  public:
  EcrireXML(const std::string& nom, Joueur *j, const bool& xsd = true);
  ~EcrireXML();
  void ecrirePerso();
  static void setLevel( const DebugLevelType& level, const unsigned& );
 private :
  /**
   * Document XML, à ne pas confondre avec le fichier. Il s'agit ici
   * de la structure (l'arbre) DOM.
   */
  QDomDocument doc;
  /**
   * Element racine du document DOM. C'est la première balise du
   * document.
   */
  QDomElement racine;
  /**
   * Fichier "physique", contient les informations en format XML.
   */
  QFile file;
  /**
   * Structure intermédiaire entre l'arbre DOM et le fichier XML.
   */
  QTextStream out;
  /**
   * Pointeur sur le PJ à sauvegarder.
   */
  Joueur *perso;
  /**
   * Permet de savoir quelle est la méthode de validation utilisée. Si
   * ce champs est \e true, alors le XSD (XML schéma) sera utilisé,
   * sinon on utilise une DTD.
   */
  bool UtiliseXSD;
  /**
   * Niveau de sortie pour la manipulation des informations extraites
   * du PJ et écrites dans l'arbre DOM. Peut être configuré par la
   * méthode EcrireXML::setLevel.
   */
  static DebugLevelType interne;
};

#endif //ECRIREXML_H
